package com.tp2.bo;

import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import com.tp2.dominio.Descuento;
import com.tp2.dominio.MedioDePago;
import com.tp2.dominio.Producto;
import com.tp2.dominio.TarjetaDescuento;

public abstract class Oferta implements Comparable<Oferta>{

	private Date vigenciaDesde;
	private Date vigenciaHasta;
	private Set<Integer> diasQueAplica;
	protected String descripcion;
	protected MedioDePago medioDePago;
	private int prioridad;
	private TarjetaDescuento tarjetaDescuento;
	private boolean generaCupon;
	
	public Oferta(){
		this.diasQueAplica = new HashSet<Integer>();
		descripcion = "";
		medioDePago = null;
		tarjetaDescuento = new TarjetaDescuento("");
		setGeneraCupon(false);
		
	}
	
    public abstract List<Descuento> aplicar(List<Producto> productos, 
    		MedioDePago medioDePago, TarjetaDescuento tarjetaDescuento);

	public Date getVigenciaDesde() {
		return this.vigenciaDesde;
	}
	public Date getVigenciaHasta() {
		return this.vigenciaHasta;
	}

	public Set<Integer> getDiasQueAplica() {
		return this.diasQueAplica;
	}

	public void setVigenciaDesde(Date vigenciaDesde) {
		this.vigenciaDesde = vigenciaDesde;
	}

	public void setVigenciaHasta(Date vigenciaHasta) {
		this.vigenciaHasta = vigenciaHasta;
	}

	public void setDiasQueAplica(Set<Integer> diasQueAplica) {
		this.diasQueAplica = diasQueAplica;
	}

	public String getDescripcion() {
		return descripcion;
	}

	public void setDescripcion(String descripcion) {
		this.descripcion = descripcion;
	}
	
    public MedioDePago getMedioDePago() {
        return medioDePago;
    }

    public void setMedioDePago(MedioDePago medioDePago) {
        this.medioDePago = medioDePago;
    }
    
	public int getPrioridad() {
		return prioridad;
	}

	public void setPrioridad(int prioridad) {
		this.prioridad = prioridad;
	}
	
    public boolean esMedioDePagoValido(MedioDePago medioDePagoCompra) {
        
    	if (getMedioDePago() != null && !medioDePagoCompra.getNombre().equalsIgnoreCase(getMedioDePago().getNombre())) {
            return false;
        }
        return true;
    }
    
    @Override
	public int compareTo(Oferta o) {
    	return this.getPrioridad()-o.getPrioridad();
	}

	public TarjetaDescuento getTarjetaDescuento() {
		return tarjetaDescuento;
	}

	public void setTarjetaDescuento(TarjetaDescuento tarjetaDescuento) {
		this.tarjetaDescuento = tarjetaDescuento;
	}
	
	public boolean esTarjetaDeDescuentoValida(TarjetaDescuento tarjetaDescuento){
		if(getTarjetaDescuento() != null && tarjetaDescuento != null
				&& !getTarjetaDescuento().getNombre().equalsIgnoreCase(tarjetaDescuento.getNombre())) {
			return false;
		}
		return true;
	}

	public boolean generaCupon() {
		return generaCupon;
	}

	public void setGeneraCupon(boolean generaCupon) {
		this.generaCupon = generaCupon;
	}

}
